package business;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import dal.BayesDAL;
import entities.BayesResult;
import entities.DataResult;
import entities.Request;
import entities.TextValue;


public class BayesBusiness {
	private static BayesBusiness instancia;
	
	private BayesBusiness(){
		
	}
	
	public static BayesBusiness getInstance(){
		if (instancia == null)
			instancia = new BayesBusiness();
		return instancia;
	}
	
	public List<TextValue> getOcupaciones()
	{
		return BayesDAL.getInstance().getOcupacion();
	}

	public List<TextValue> getRangoSaldo()
	{
		return BayesDAL.getInstance().getRangoSaldo();
	}

	public List<TextValue> getRangoEdad()
	{
		return BayesDAL.getInstance().getRangoEdad();
	}

	
	public List<TextValue> getEstadoCivil()
	{
		return BayesDAL.getInstance().getEstadoCivil();
	}

	public List<TextValue> getNiveleducacion()
	{
		return BayesDAL.getInstance().getNiveleducacion();
	}
	
	public List<TextValue> getTieneDeuda()
	{
		return BayesDAL.getInstance().getTieneDeuda();
	}

	public List<TextValue> getTienePrestamoPersonales()
	{
		return BayesDAL.getInstance().getTienePrestamoPersonales();
	}

	public List<TextValue> getTienePrestamoHipotecarios()
	{
		return BayesDAL.getInstance().getTienePrestamoHipotecarios();
	}
	
	public List<TextValue> getTipoContacto()
	{
		return BayesDAL.getInstance().getTipoContacto();
	}
	
	public BayesResult calcularBayes(Request request)
	{
		BayesResult prob = new BayesResult();
		DataResult r;
		try {
			r = this.getProbabilidades(request);

			prob.Si=  r.Si.plazoFijo * r.Si.edad * r.Si.ocupacion * r.Si.estadoCivil *
					  r.Si.nivelEducacion * r.Si.adeudaCuotaCredito *
					  r.Si.tienePrestamoHipotecarios * r.Si.tienePrestamoPersonales *
					  r.Si.tipoContacto * r.Si.rangoSaldo;

			prob.No = r.No.plazoFijo * r.No.edad * r.No.ocupacion * r.No.estadoCivil *
					  r.No.nivelEducacion * r.No.adeudaCuotaCredito *
					  r.No.tienePrestamoHipotecarios * r.No.tienePrestamoPersonales *
					  r.No.tipoContacto * r.No.rangoSaldo;		
			
			System.out.println("Probabilida Si=> " + prob.Si);
			System.out.println("Probabilidad No => " + prob.No);
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		 //DecimalFormat df = new DecimalFormat("##.##########");
		 //prob.No = Double.parseDouble(df.format(prob.No));
		 //prob.Si = Double.parseDouble(df.format(prob.Si));
		 
		return prob;
	}
	
	private DataResult getProbabilidades(Request request) throws SQLException
	{
		
		DataResult resultado = new DataResult();
		request.plazoFijo = true;
		resultado.Si = BayesDAL.getInstance().calcularProbabilidad(request);
		
		request.plazoFijo = false;
		resultado.No = BayesDAL.getInstance().calcularProbabilidad(request);
		
		return resultado;
		
	}

	public void insertData(Request request)
	{
		try {
			BayesDAL.getInstance().insertData(request);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public int findInList(String descripcion, List<TextValue> lista) {

		for(TextValue item : lista)
		{
			if(item.getDescripcion().equals(descripcion)){
				return item.getId();
			}
		}
		
		return 0;
	}

}
